/**
 * 路由拦截器
 * */
import store from '../store'
import router from './index'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'

NProgress.configure({ showSpinner: false })

const whiteList = ['/login', '/register']

//添加一个导航钩子，它会在每次路由之前被执行。返回一个用来移除该钩子的函数。

//to: 即将要进入的目标 用一种标准化的方式
// from: 当前导航正要离开的路由 用一种标准化的方式
//在之前的 Vue Router 版本中，还可以使用 第三个参数 next
// 。这是一个常见的错误来源，我们经过 RFC 讨论将其移除。
// 然而，它仍然是被支持的，这意味着你可以向任何导航守卫传递第三个参数。
// 在这种情况下，确保 next 在任何给定的导航守卫中都被严格调用一次。
// 它可以出现多于一次，但是只能在所有的逻辑路径都不重叠的情况下，否则钩子永远都不会被解析或报错。
router.beforeEach((to, from, next) => {
    //开启加载进度条
    NProgress.start()
    if (getToken()) {
        /* has token*/
        if (to.path === '/login') {
            next({ path: '/' })
            NProgress.done()
        } else {
            if (store.state.user.roles.length === 0) {
                // 判断当前用户是否已拉取完user_info信息
                store.dispatch('GetInfo').then(() => {
                    next({ path: '/' })
                }).catch(err => {
                    store.dispatch('LogOut').then(() => {
                        Message.error(err)
                        next({ path: '/' })
                    })
                })
            } else {
                next()
            }
        }
    } else {
        // 没有token
        if (whiteList.indexOf(to.path) !== -1) {
            // 在免登录白名单，直接进入
            next()
        } else {
            // 否则全部重定向到登录页
            next('/login')
            NProgress.done()
        }
    }
})

//路由后
router.afterEach(() => {
  NProgress.done()
})
